const express = require('express');
const cors = require('cors');
const dotenv = require('dotenv');
const bodyParser = require('body-parser');
const db = require('./config/database');
const logger = require('./middleware/logger');
const errorHandler = require('./middleware/errorHandler');
const apiRoutes = require('./routes/api');

// 加载环境变量
dotenv.config();

// 初始化Express应用
const app = express();
const PORT = process.env.PORT || 3000;

// 连接数据库
db.authenticate()
  .then(() => {
    console.log('数据库连接成功');
    // 同步数据库模型（在开发环境下）
    if (process.env.NODE_ENV === 'development') {
      // 使用force: true来重新创建表，解决索引过多的问题
      db.sync({ force: true }).then(async () => {
        console.log('数据库模型同步完成');
        
        // 初始化测试数据
        try {
          const { initDatabase } = require('./scripts/initDatabase');
          await initDatabase();
          console.log('测试数据初始化完成');
        } catch (error) {
          console.error('测试数据初始化失败:', error);
        }
      }).catch(err => {
        console.error('数据库模型同步失败:', err);
      });
    }
  })
  .catch(err => {
    console.error('数据库连接失败:', err);
    // 在生产环境中，如果数据库连接失败，应该优雅地退出
    if (process.env.NODE_ENV === 'production') {
      process.exit(1);
    }
  });

// 应用中间件
app.use(cors());
app.use(express.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(logger);

// 健康检查路由
app.get('/health', (req, res) => {
  res.status(200).json({
    status: 'ok',
    message: '服务器运行正常',
    timestamp: new Date().toISOString()
  });
});

// API路由
app.use('/api', apiRoutes);

// 静态文件服务
app.use(express.static('public'));

// 404错误处理
app.use((req, res, next) => {
  const error = new Error('Not Found');
  error.status = 404;
  next(error);
});

// 错误处理中间件
app.use(errorHandler);

// 启动服务器
const server = app.listen(PORT, () => {
  console.log(`服务器运行在 http://localhost:${PORT}`);
  console.log(`环境: ${process.env.NODE_ENV || 'development'}`);
});

// 处理终止信号
process.on('SIGINT', () => {
  console.log('服务器正在关闭...');
  server.close(() => {
    console.log('服务器已关闭');
    process.exit(0);
  });
});

module.exports = app;